/*
 * @Author: 0x9DEFA478
 * @Date: 2021-07-27 17:09:19
 * @LastEditTime: 2021-07-27 19:34:27
 * @LastEditors: 0x9DEFA478
 * @Description: 
 * QQ:2652450237
 * ============================================================================================================================================
 * 
 * 
 * 
 *                                                                                               ************      ****************************
 *                                                                                             ************      ****************************  
 *                                                                                           ************      ****************************    
 *                                                                                         ************      ****************************      
 *                                                                                       ************      ************                        
 *                                                                                     ************      ************                          
 *                                                                                   ************      ************                            
 *                                                                                 ************      ************                              
 *                                                                               ************      ************                                
 *                                                                             ************      ************                                  
 *                                                                           ************      ************                                    
 *                                                                         ************      ************                                      
 *                                                                       ************      ************                                        
 *                                                                     ************      ************                                          
 *                                                                   ************      ************                                            
 *                                                                 ************      ************                                              
 *                                                               ************      ************                                                
 *                                                             ************      ************                                                  
 *                                                           ************      ************                                                    
 *                                                         ************      ************                                                      
 *                                                       ************      ************                                                        
 *                                                     ************      ************                                                          
 *                                                   ************      ************                                                            
 *                                                 ************      ************                                                              
 *                                               ************      ************                                                                
 *                                             ************      ************                                                                  
 *                                           ************      ************                                                                    
 *                                         ************      ************                                                                      
 *                                       ************      ************                                                                        
 *                                     ************      ************                                                                          
 *                                   ************      ************                                                                            
 *                                 ************      ************                                                                              
 *                               ************      ************                                                                                
 *                             ************      ************                                                                                  
 *                           ************      ************                                                                                    
 *                         ************      ************                                                                                      
 *       ****************************      ************                                                                                        
 *     ****************************      ************                                                                                          
 *   ****************************      ************                                                                                            
 * ****************************      ************                                                                                              
 * 
 * 
 * 
 * ============================================================================================================================================
 * 
 */
#ifndef __W25Q128_sim_H_
#define __W25Q128_sim_H_

#define vW25Q_ID_128      0xEF17U
#define vW25Q_ID_64       0xEF16U
#define vW25Q_ID_32       0xEF15U
#define vW25Q_ID_16       0xEF14U
#define vW25Q_ID_80       0xEF13U


//status Mask
//S0~S7
#define vW25Q_Status_BUSY                      0x01U
#define vW25Q_Status_WEL                       0x02U
#define vW25Q_Status_BP0                       0x04U
#define vW25Q_Status_BP1                       0x08U
#define vW25Q_Status_BP2                       0x10U
#define vW25Q_Status_TB                        0x20U
#define vW25Q_Status_SEC                       0x40U
//#define vW25Q_Status_                          0x80U

//S8~S15
#define vW25Q_Status_SRL                       0x01U
#define vW25Q_Status_QE                        0x02U
//#define vW25Q_Status_                          0x04U
#define vW25Q_Status_LB1                       0x08U
#define vW25Q_Status_LB2                       0x10U
#define vW25Q_Status_LB3                       0x20U
#define vW25Q_Status_CMP                       0x40U
#define vW25Q_Status_SUS                       0x80U

//S16~S24
//#define vW25Q_Status_                          0x01U
//#define vW25Q_Status_                          0x02U
#define vW25Q_Status_WPS                       0x04U
//#define vW25Q_Status_                          0x08U
//#define vW25Q_Status_                          0x10U
#define vW25Q_Status_DRV2                      0x20U
#define vW25Q_Status_DRV1                      0x40U
//#define vW25Q_Status_                          0x80U



#define vW25Q_CMD_StatusREGWriteEnable         0x50U

#define vW25Q_CMD_ReadREG_Status1              0x05U
#define vW25Q_CMD_WriteREG_Status1             0x01U

#define vW25Q_CMD_ReadREG_Status2              0x35U
#define vW25Q_CMD_WriteREG_Status2             0x31U

#define vW25Q_CMD_ReadREG_Status3              0x15U
#define vW25Q_CMD_WriteREG_Status3             0x11U


#define vW25Q_CMD_WriteEnable                  0x06U
#define vW25Q_CMD_WriteDisable                 0x04U

#define vW25Q_CMD_ReadData                     0x03U
#define vW25Q_CMD_FastReadData                 0x0BU
#define vW25Q_CMD_FastReadDualOutput           0x3BU
#define vW25Q_CMD_FastReadDual_IO              0xBBU
#define vW25Q_CMD_FastReadQuadOutput           0x6BU
#define vW25Q_CMD_FastReadQuad_IO              0xEBU

#define vW25Q_CMD_PageProgram                  0x02U
#define vW25Q_CMD_QuadPageProgram              0x32U

#define vW25Q_CMD_SectorErase                  0x20U //4096字节擦除 4096字节对齐
#define vW25Q_CMD_32KBErase                    0x52U //32字节擦除
#define vW25Q_CMD_64KBErase                    0xD8U //64字节擦除
#define vW25Q_CMD_ChipErase                    0xC7U //全片擦除

#define vW25Q_Get_ID                           0x90U //获取id




/**
 * @brief 初始化W25Q
 * @return 无
 */
void W25Q_sim_Init(void);

/**
 * @brief 读取状态寄存器1
 * @return 无
 */
unsigned char W25Q_sim_GetStatusReg1(void);

/**
 * @brief 读取状态寄存器2
 * @return 无
 */
unsigned char W25Q_sim_GetStatusReg2(void);

/**
 * @brief 读取状态寄存器3
 * @return 无
 */
unsigned char W25Q_sim_GetStatusReg3(void);


/**
 * @brief 状态寄存器写使能
 * @return 无
 */
void W25Q_sim_RegWriteEnable(void);

/**
 * @brief 写使能
 * @return 无
 */
void W25Q_sim_WriteEnable(void);

/**
 * @brief 等待忙碌
 * @return 无
 */
void W25Q_sim_WaitBusy(void);


/**
 * @brief 写状态寄存器1
 * @return 无
 */
void W25Q_sim_SetStatusReg1(unsigned char value);

/**
 * @brief 写状态寄存器2
 * @return 无
 */
void W25Q_sim_SetStatusReg2(unsigned char value);

/**
 * @brief 写状态寄存器3
 * @return 无
 */
void W25Q_sim_SetStatusReg3(unsigned char value);

/**
 * @brief 设置为quad模式
 * @return 无
 */
void W25Q_sim_SetQuad(void);

/**
 * @brief 获取ID
 * @return 16位ID
 */
unsigned short W25Q_sim_GetID(void);

/**
 * @brief 获取容量
 * @return flash大小
 */
int W25Q_sim_GetSize(void);








/**
 * @brief 读数据
 * @param W25qADDR 读取的地址
 * @param Dst 读取到的缓冲区的指针
 * @param Len 读取长度
 * @return 无
 */
void W25Q_sim_ReadData(unsigned int W25qADDR,unsigned char *Dst,int Len);


/**
 * @brief 写数据
 * @param W25qADDR 写入的地址
 * @param Src 要写入的数据的指针
 * @param Len 写入长度
 * @return 无
 */
void W25Q_sim_PageProgram(unsigned int W25qADDR,unsigned char *Src,int Len);


/**
 * @brief 擦除 4096字节
 * @param W25qADDR 要擦除扇区的地址
 * @return 无
 */
void W25Q_sim_Erase(unsigned int W25qADDR);

/**
 * @brief 擦除 32*1024字节
 * @param W25qADDR 要擦除扇区的地址
 * @return 无
 */
void W25Q_sim_32KBErase(unsigned int W25qADDR);

/**
 * @brief 擦除 64*1024字节
 * @param W25qADDR 要擦除扇区的地址
 * @return 无
 */
void W25Q_sim_64KBErase(unsigned int W25qADDR);

/**
 * @brief 全片擦除 等待结束
 * @return 无
 */
void W25Q_sim_ChipErase(void);


#endif //__W25Q128_sim_H_
